
	var KeyEventHandler = {
		/**
		* @memberOf KeyEventHandler
		* @description document 에 할당될 keydown Event 대리자.
		*/
		handleEvent : function (evt) {}
	};
	/**
	 * @private
	 * @listens event:keydown
	 * @description document 에 할당될 keydown Event 대리자를 갖는 Static 객체
	*/
	var MouseEventHandler = {
		/**
		* @memberOf KeyEventHandler
		* @description document 에 할당될 keydown Event 대리자.
		*/
		handleEvent : function (evt) {}
	};



	 /**
	 * @class EventCtl Class는 keydown 처리할 인스턴스 handler 를 위한 추상 클래스.
	 * @constructor EventCtl
	 * @description EventCtl Class를 상속 받은 객체에서 Overriding 하여 자식 객체만의 처리를 할 수 있다.
	 */
	function EventCtl () {}
	EventCtl.prototype = {
		/**
		 * @instance
		 * @listens event:keydown
		 * @memberOf EventCtl
		 * @param {event} keydown 객체 (이벤트가 발생한 객체는 항상 document 다)
		 * @description keydown handler 로 handleEvent에서 EventCtl 의 인스턴스 객체 member로 선언된 각 keydown Event의 handler 를 호출한다.
		 */
		handleEvent : function (event) {
			if (event.type == "mousewheel")  {
				if( event.wheelDelta < 0) this.down();
				else this.up();
			} else if (event.type == 'keydown') {
				var key = event.keycode || event.which;
				var backspace = 8;
				var backkey = CJ.IS_TV ? VK_BACK : 27;
				switch (key){
					case backspace:
					case backkey:
						/** document me */
						this.back();
						if (key == backspace) {
							event.preventDefault();
						}
						break;
					case VK_ENTER:
						this.enter(event);
						break;
					case VK_RIGHT:
						this.right();
						break;
					case VK_LEFT:
						this.left();
						break;
					case VK_DOWN:
						this.down();
						break;
					case VK_UP:
						this.up();
						break;
					case VK_PAGE_UP:
						this.pageUp();
						break;
					case VK_PAGE_DOWN:
						this.pageDown();
						break;
				}
			}
		},
		/**
		 * @instance
		 * @listens event:VK_BACK.keydown
		 * @memberOf EventCtl
		 * @virtual
		 * @return {void}
		 * @description EventCtl 을 상속 받은 객체에서 VK_BACK.keydown 를 처리할 가상 handler
		 */
		back: function(){},
		/**
		 * @instance
		 * @listens event:VK_ENTER.keydown
		 * @memberOf EventCtl
		 * @virtual
		 * @return {void}
		 * @description EventCtl 을 상속 받은 객체에서 VK_BACK.keydown 를 처리할 가상 handler
		 */
		enter: function(){},
		/**
		 * @instance
		 * @listens event: VK_RIGHT.keydown
		 * @memberOf EventCtl
		 * @virtual
		 * @return {void}
		 * @description EventCtl 을 상속 받은 객체에서 VK_RIGHT.keydown 를 처리할 가상 handler
		 */
		right: function(){},
		/**
		 * @instance
		 * @listens event:VK_LEFT.keydown
		 * @memberOf EventCtl
		 * @virtual
		 * @return {void}
		 * @description EventCtl 을 상속 받은 객체에서 VK_LEFT.keydown 를 처리할 가상 handler
		 */
		left: function(){},
		/**
		 * @instance
		 * @listens event:VK_DOWN.keydown
		 * @memberOf EventCtl
		 * @virtual
		 * @return {void}
		 * @description EventCtl 을 상속 받은 객체에서 VK_DOWN.keydown 를 처리할 가상 handler
		 */
		down: function(){},
		/**
		 * @instance
		 * @listens event:VK_UP.keydown
		 * @memberOf EventCtl
		 * @virtual
		 * @return {void}
		 * @description EventCtl 을 상속 받은 객체에서 VK_UP.keydown 를 처리할 가상 handler
		 */
		up: function(){},
		/**
		 * @instance
		 * @listens event:VK_PAGE_UP.keydown
		 * @memberOf EventCtl
		 * @virtual
		 * @return {void}
		 * @description EventCtl 을 상속 받은 객체에서 VK_DOWN.keydown 를 처리할 가상 handler
		 */
		pageUp: function(){},
		/**
		 * @instance
		 * @listens event:VK_PAGE_DOWN.keydown
		 * @memberOf EventCtl
		 * @virtual
		 * @return {void}
		 * @description EventCtl 을 상속 받은 객체에서 VK_UP.keydown 를 처리할 가상 handler
		 */
		pageDown: function(){},
		/**
		 * @instance
		 * @method
		 * @memberOf EventCtl
		 * @virtual
		 * @return {void}
		 * @description keydown handler를 처리할 인스턴스 객체로 변경
		 */
		delegate: function(){
			var self = this;
			KeyEventHandler.handleEvent = function (event) {
				self.handleEvent.call(self, event);
			};
			MouseEventHandler.handleEvent = function (event) {
				self.handleEvent.call(self, event);
			};
		}
	};
	
	function KeyEventControl(){
		console.log('KeyEvent Control');
		document.addEventListener('keydown', KeyEventHandler, false);
		document.addEventListener('mousewheel', MouseEventHandler, false);
		document.addEventListener('click', MouseEventHandler, false);
	}
	
	function KeyEventDecontrol(){
		console.log('KeyEvent Decontrol');
		document.removeEventListener('keydown', KeyEventHandler, false);
		document.removeEventListener('mousewheel', MouseEventHandler, false);
		document.removeEventListener('click', MouseEventHandler, false);
	}

	
	$(document).ready(function(){
		KeyEventControl();
		
		//lg keyboard 가 나오면 key, mouse 컨트롤 해제
		lgKb.onKeyboardShow = KeyEventDecontrol;
		lgKb.onKeyboardHide = KeyEventControl;
	});